const { Controller } = require('egg');

class UserController extends Controller {
    /**
     * 注册
     */
    async register() {
        const { ctx } = this;
        // 解构参数
        const { username, nickname, password } = ctx.request.body;
        // 非空校验
        if (!username || !nickname || !password) {
            ctx.body = {
                code: 400,
                message: '缺少必须参数',
            };
            return;
        }
        // 校验账户长度
        if (!/^\w{5,20}$/.test(username)) {
            ctx.body = {
                code: 400,
                message: '账号长度必须是 5 ~ 20 个字母下划线数字组合',
            };
            return;
        }
        // 校验密码长度
        if (!/[^\W]{6,}$/.test(password)) {
            ctx.body = {
                code: 400,
                message: '密码长度至少 6 位',
            };
            return;
        }
        // 用户唯一性校验
        let user = await ctx.service.user.readByUsername(username);
        if (user) {
            ctx.body = {
                code: 403,
                message: '用户已存在，不允许重复创建',
            };
            return;
        }
        // 保存用户信息到数据库
        let res = await ctx.service.user.create({
            username,
            password: ctx.helper.passwordEncoder(password),
            nickname,
        });
        // 判断是否保存成功
        if (res.affectedRows !== 1) {
            ctx.body = {
                code: 500,
                message: '注册失败，请稍后再试！',
            };
            return;
        }
        // 保存成功了，响应前台
        ctx.body = {
            code: 201,
            data: {
                uid: res.insertId,
            },
            message: '注册成功',
        };
    }

    /**
     * 登录
     */
    async login() {
        const { ctx } = this;
        // 解构参数
        const { username, password } = ctx.request.body;
        if (!username || !password) {
            ctx.body = {
                code: 400,
                message: '缺少必须参数',
            };
            return;
        }
        let user = await ctx.service.user.readByUsername(username);
        if (!user) {
            ctx.body = {
                code: 404,
                message: '用户不存在',
            };
            return;
        }
        // 校验密码
        if (user.password !== ctx.helper.passwordEncoder(password)) {
            ctx.body = {
                code: 400,
                message: '用户密码不匹配',
            };
            return;
        }
        // console.log('user', user);
        let obj = {};
        obj.id = user.id;
        obj.username = user.username;
        obj.nickname = user.nickname;
        // 用户信息校验成功了，我们直接生成 token 吧
        const token = ctx.helper.genToken(obj);
        // 返回响应
        ctx.body = {
            code: 200,
            data: {
                token,
            },
            message: '登录成功',
        };
    }
}

module.exports = UserController;
